Repository navigation
pm-dispatch: a lane without the contract-review tier knocks a review seat, never triage — one route in contract-review.md, and post-stamped refuses the triage knock - #33287
Conversation
…er knocks a review seat, never triage contract-review.md 〈复核归属与资格〉 states the route once: a lane self-reviews only when it reaches CONTRACT_REVIEW_TIER; when it cannot (the account cannot reach the tier, a 429 refusal, or the maintainer rationed it) it writes the hand-off line and knocks a seated review seat, then a sibling seat with the tier, else leaves the PR on the owed-review list. lanes/review.md points at it instead of restating it; the dispatch runbook makes the order carry the route. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5nTNwm26u4w9389ads
…triage The write tool's own input check, beside the signature and keyed-line refusals in judgeBody: a mailbox comment whose `To:` the doorbell reader reads as a triage seat and whose key is `Request: contract-review` is refused before any write, naming the review seat's mailbox, the sibling fallback and the owed-review list. Comments only; every other key to triage passes. New self-test battery (9 cases). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5nTNwm26u4w9389ads
|
domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb Contract reviewServed-tier: Inputs read: card 33157 (body and both comments: claim 6879512661, os-dev-report 6879907765), PR 33287 (body, 5-file list, net diff +82 / -5 against ① Derived judgments
② Semver level
Clause-②: no — correct. No published accept set, schema, error code or runtime capability changes; the refusal narrows only what an internal write tool will post, so the ③ Boundary flags
④ Design judgment
Findings: 0 must-fix, 2 should-fix, 5 nit. The two should-fix items earn a delta review of their fix on the new head by this reviewer; the nits are left as accepted deviations or a follow-up card. Implemented-by: VERDICT: PASS Adopted by the seat 2026-11-14T15:48Z · isolated sub-agent at CONTRACT_REVIEW_TIER · Ruling-ref: Leehom card cmsg_01TenzsRopZj4jMbvjX8uz1XFhuiZmTH8VFgMmHRmpiGAb, option A, tapped 2026-11-14T15:37Z |
…ge contract-review knock is refused too contract-review.md keeps only the two operative maintainer lines as its provenance (the superseded arrangement read as the opposite of the route) and its ceiling is lowered to the measured 63. The route paragraph ends on the hand-off template instead of a colon after (a)(b)(c); the runbook line names the self-review case. readMailboxLine's unreadable reading now carries the id, key and seat it read before the template failed, so post-stamped refuses a triage-addressed `Request: contract-review` knock whether or not it spells its template. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5nTNwm26u4w9389ads
|
domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb Contract reviewServed-tier: Delta review of round 1, and a full record for this head. Inputs read: card 33157 (body and all four comments: claim 6879512661, os-dev-reports 6879907765 and 6880395481, the earlier record 6880051283 on the previous head), PR 33287 (body as patched, 6-file list, net diff +89 / -8 against ① Derived judgments
② Semver level
Clause-②: no — correct. No published accept set, schema, error code or runtime capability changes; the ③ Boundary flags
④ Design judgmentEarlier should-fix 1 (superseded quote in the provenance block): FIXED. The block is one line with the two operative quotes; the superseded arrangement and the contextual quote are gone, and the ceiling came down with them. Earlier should-fix 2 (malformed triage knock passed): FIXED. The reader's
Findings: 0 must-fix, 0 should-fix, 5 nit (two new, three carried). Nits alone end the round: they are left as accepted deviations or a follow-up card, since a fix on these files would move the head. Implemented-by: VERDICT: PASS Adopted by the seat 2026-11-14T16:17Z · isolated sub-agent at CONTRACT_REVIEW_TIER · Ruling-ref: Leehom card cmsg_01TenzsRopZj4jMbvjX8uz1XFhuiZmTH8VFgMmHRmpiGAb, option A, tapped 2026-11-14T15:37Z |
|
domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb 席位核对Verdict: ACCEPT, seat lands (Tier S) · head
|
Requested by Leehom · project thread
domain:skills#1 · os-project-manager · session_01FEkQ5nTNwm26u4w9389ads
Fixes #33157
Clause-②: no
Metadata-protocol: none
维护者速读
contract-review.md〈复核归属与资格〉现在只在一处写送审路由:车道能取CONTRACT_REVIEW_TIER才自审;取不到(账号够不到、429、维护者限配)就落交接行并敲在座复核席,⛔ 非分诊;无复核席敲能取该档的兄弟席,都没有就留在欠审表。lanes/review.md改为指向它;派发细则加一行让派发令带上这条路由。post-stamped.mjs拒发To:为分诊席的Request: contract-review敲门(格式不全的也拒)。contract-review.md第 21–25 行;post-stamped.mjs的triageContractReviewKnock;check-skill-line-ratchet.mjs两行上限上调的注释。node scripts/pm/post-stamped.mjs --self-test,预期 771 个用例全过,含新电池 "the review route" 10 例。What changes
.claude/skills/pm-dispatch/references/contract-review.md〈复核归属与资格〉). The 429-only line becomes the route: a lane self-reviews only when it can takeCONTRACT_REVIEW_TIER; when it cannot (the account cannot reach the tier, a 429 refusal, or the maintainer rationed it) it does not step down a tier and ⛔ never goes to triage. It writes theContract-review-handoff:line (template unchanged, still pinned byrecord-recognisers.mjs) and in the same stroke knocks a seated review seat withRequest: contract-review. With no review seat seated it names and knocks a sibling seat that can take the tier. With neither, it hangs the waiting label and the PR stays on the owed-review list for rules (a)(b)(c) below it. The provenance is one line carrying the two operative maintainer lines verbatim, 「立 skills 卡,把契约复审的路由直接改成 review 座位」「没有 fable 时,找 review 座位」 (card 33157). The superseded arrangement 「契约复审只有在车道没有fable的时候才会找你执行…」 is not quoted in the rule file, because unmarked it reads as the opposite of the route (review round 1).lanes/review.md〈路由〉 no longer restates who a lane knocks; it points at that route line and keeps only the seat's own part (any review seat's mailbox, the idle one takes it).references/dispatch-runbook.md〈派发词构造细则〉, one line): the order carries the route, the dev names the owed review in its hand-back and never knocks, and the seat self-reviews or sends it to a review seat percontract-review.md, ⛔ never triage.os-dev.mdis not touched (so the card stays off theCONTRACT_REVIEW_TIERbuild face).scripts/pm/post-stamped.mjs).judgeBody(the one pathmainandlabel-write.mjs --comment-fileshare) refuses a comment thatreadMailboxLine(imported fromrecord-recognisers.mjs, not restated) reads asRequest: contract-reviewwith aTo:triage seat. That holds whether the knock reads or is unreadable (a missing reason, a bare PR number, a second line).readMailboxLine's unreadable reading now also carries theid,keyandtoit parsed before the template failed (review round 1; one new case in that file's doorbell battery). Itsrefusedandreadreadings are unchanged. The refusal namesTo: review#Nand the seat post'sMailbox:line, the sibling fallback, the owed-review list and the rule's home. Comments only; every other key to triage (urgent-triage,triage, …) and every card body pass. A comment the reader refuses outright (noTo:seat, a key outside the table) names no contract-review knock and passes, as today. The usage text gains three lines.scripts/pm/check-skill-line-ratchet.mjs):contract-review.md60 → 63 (+3: the rule takes 3 lines where the 429 line took 1, plus 1 provenance line; lowered from round 0's 65 to the measured count) anddispatch-runbook.md245 → 246 (+1). Both are ruled raises. The ruling of record is the maintainer's words quoted in the body of card pm-dispatch: a lane without CONTRACT_REVIEW_TIER (fable) sends its contract review to the review seat, never to triage — write the ruling into contract-review.md / lanes/review.md and refuse a contract-review knock addressed to triage #33157 (filing gate ③), verbatim: 「立 skills 卡,把契约复审的路由直接改成 review 座位」 and 「没有 fable 时,找 review 座位」. The claim is comment 6879512661. Measured deltas are +3 and +1, and the raise is backed for the rule lines and that one provenance line only; and eachCEILINGScomment says so.lanes/review.mdstays at 21.skip-changeset:.claude/**andscripts/pm/**only, published by no package.Tests
node scripts/pm/post-stamped.mjs --self-test: 771 cases across 28 batteries, all pass. The new battery is "the review route", floor 10:triage#1is refused, and the refusal names that seat, the review seat's mailbox, the sibling fallback, the owed-review list andreferences/contract-review.md;review#1passes;To: triageandTo: Triage#2are refused the same way;review#1/review#2passes, and so does a knock to a sibling lane seat (domain:server#2);Request: urgent-triageandRequest: triageto triage pass, and a card BODY with the same text passes;readMailboxLineis imported, not restated, and the check sits insidejudgeBodyon comments only.--dry-run --commentof a signed knock totriage#1exits 2 with the refusal (excerpt in Verification).node scripts/pm/record-recognisers.mjs --self-test: 383 cases pass, including ⭐ an unreadable knock still namesid,keyandto(round 1).node scripts/pm/label-write.mjs --self-test: 203 cases pass. It folds comments through the samejudgeBody.node scripts/pm/check-skill-line-ratchet.mjsand its--self-test(164 cases) pass;check-skill-id-lintis clean (113 files).Acceptance notes
scripts/pm/record-recognisers.mjsjoins the diff for the unreadable reading's three fields. That file is outside the claim's listed surface; the round-1 ask ("refuse on thetoand key the reader already parsed") needs it.instrument-discipline.md: hard gates answer whether a governed registry entry, a queue guard, a CI test or a review record holds). SKILL.md's lane table filespost-stamped.mjsunder 「非门禁的scripts/pm/**(PM 循环工具)」. The refusal sits beside the signature and keyed-line refusals thatjudgeBodyalready makes (seat-post-protocol.md: 「缺即写工具拒发」). No landing, check, workflow, label or queue guard reads it, and nothing it refuses was ever on the board. The seat adopted this reading in review round 1.execution-duties.mdis not touched. The order says to point from it only if it reads the route today. It does not name a destination. Lines 122–124 say how a seat gets the tier (an isolated subagent or a card thread) and when it may fall back to the default tier for building. They do not say whom to ask for a review. The claim's file surface leaves it out too, and north-star: the road says data silently wrong or lost is P1 (as Priority rule 2 does), and Priority rule 3 does not hold a p2 pm:blocking card that unblocks the undispatched P0/P1 #33163 may edit it this round.pm:seatissue bodies (search API,label:pm:seat, 2026-11-14) found 0 with 「fable 不多了」, 「契约复审找分诊」 or 「后续契约复审」. An exact-phrase search for 「后续契约复审找分诊」 across the repository hits only automation: a flow's answer carries the dropped-field fact of its map items and of a subflow child that paused and resumed (delegated half of #32861) #33019 (closed), PR fix(automation): a flow's answer also names the read-only fields its map items and resumed subflow children dropped (#33019) #33068 (closed) and this card. The looser 「fable 不多了」 search also returns [PM seat] triage (objectstack-wide) — 🟢 hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH · trig_01377heGw9UoChYTLnz93qjo (hourly) · state = body + the round records newer than it #6015 (triage seat) and [PM seat] domain:cli — ⏳ vacant · archive of domain:server seat 1 (#6367) #6024 (an archived seat post) on comment text, which was not read comment by comment (2,036 and 478 comments). Nothing here edits a seat post; the seat handles them.os-dev.mdgives the dev no mailbox writes, and this lane's standing lines forbid a dev knock). So the route goes into the order, and the hand-back names the owed review for the seat to route. That is one runbook line, as the order allows.check-governed-merges.mjs --branchmeasures Tier S: every governed path is under.claude/**. The seat lands it after a## Contract reviewPASS atCONTRACT_REVIEW_TIERon the current head.Verification
dispatch-gates --tier (head 7da7deb)
check-governed-merges.mjs --branch claude/project-thread-g458vc
post-stamped --dry-run of a knock to triage
Derived gates (dispatch-gates --commands, 40 commands, head 7da7deb)
Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01FEkQ5nTNwm26u4w9389ads